package com.dkd.day20250714;

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class Main17 {
    public static void main(String[] args) {
        //二叉树也可以用数组来存储，给定一个数组，树的根节点的值存储在下标1，对于存储在下标N的节点，它的左子节点和右子节点分别存储在下标2*N和2*N+1，并且我们用值-1代表一个节点为空。
        //
        //给定一个数组存储的二叉树，试求从根节点到最小的叶子节点的路径，路径由节点的值组成。
        //
        //输入描述
        //输入一行为数组的内容，数组的每个元素都是正整数，元素间用空格分隔。
        //
        //注意第一个元素即为根节点的值，即数组的第N个元素对应下标N，下标0在树的表示中没有使用，所以我们省略了。
        //
        //输入的树最多为7层。
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] words = s.split(" ");
        int[] arr = new int[words.length];
        for (int i = 0; i < words.length; i++) {
            arr[i] = Integer.parseInt(words[i]);
        }
        solve(arr);

    }

    public static void solve (int[] arr){
        int smallIndex = arr[0];
        int small = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            //判断是叶子节点
            if (arr[i] == -1) continue;
            if((2*i > arr.length-1) || (2*i == arr.length-1 && arr[2*i] == -1) || (arr[2*i]==-1 && arr[2*i+1] == -1)){
                if(arr[i] < small){
                    smallIndex = i;
                    small = arr[i];
                }
            }
        }

        Stack<Integer> stack = new Stack<>();
        //反向遍历
        while(smallIndex != -1){
            stack.push(arr[smallIndex]);
            if(smallIndex == 2){
                smallIndex = 0;
            }

            smallIndex = smallIndex/2;

            if(smallIndex == 0){
                stack.push(arr[smallIndex]);
                break;
            }
        }

        while(!stack.isEmpty()){
            System.out.print(stack.pop());
            System.out.print(" ");
        }

    }
}
